# 数字系统转换器

# 题目内容

在一个特殊的数学系统中,每个数字都有其独特的表示方式。给定两个不同的数字字符集和一个数字字符串,你需要将这个数字从一个字符系统转换到另一个字符系统。实现一个函数,将使用源字符集表示的数字转换为使用目标字符集表示的数字。

补充说明:

  • $1 \le num.length \le 100$
  • $2 \le sourceDigits.length \le 36$
  • $2 \le targetDigits.length \le 36$
  • sourceDigitstargetDigits 由不同的字符组成,且不包含重复字符
  • num 中的所有字符都存在于 sourceDigits
  • 输入保证是有效的,不会出现非法字符
  • 转换结果不应包含前导零,除非数字本身就是 $0$

# 样例

# 样例 1

输入

101
01
0123456789
1
2
3

输出

5
1

说明: 二进制 "101" 转换为十进制是 "5"。

# 样例 2

输入

ff
0123456789abcdef
0123456789
1
2
3

输出

255
1

说明: 十六进制 "ff" 转换为十进制是 "255"。

# 样例 3

输入

100
01
0123456789abcdef
1
2
3

输出

4
1

说明: 二进制 "100" 转换为十六进制是 "4"。

# 样例 4

输入

7
0123456789
01
1
2
3

输出

111
1

说明: 十进制 "7" 转换为二进制是 "111"。

# 样例 5

输入

10012
01234
012
1
2
3

输出

212102
1

说明: 五进制 "10012" 转换为三进制是 "212102"。

# 代码

const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});

let lines = [];
rl.on('line', (input) => {
    lines.push(input);
    if (lines.length === 3) {
        const num = lines[0].trim();
        const sourceDigits = lines[1].trim();
        const targetDigits = lines[2].trim();
        let s10 = 0n;
        const l1 = BigInt(sourceDigits.length);
        for(let i=0; i<num.length; i++) {
            s10 = s10 * l1 + BigInt(sourceDigits.indexOf(num[i]));
        }
        
        let ans = '';
        const l2 = BigInt(targetDigits.length);
        while(s10 > 0n) {
            const i = s10%(l2);
            ans = targetDigits[i] + ans;
            s10 = BigInt(s10 / l2);
        }
        console.log(ans);
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29